package com.cccx.easy;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 给定一个由 整数 组成的 非空 数组所表示的非负整数，在该数的基础上加一。
 * <p>
 * 最高位数字存放在数组的首位， 数组中每个元素只存储单个数字。
 * <p>
 * 你可以假设除了整数 0 之外，这个整数不会以零开头。
 * <p>
 * 示例 1：
 * <p>
 * 输入：digits = [1,2,3]
 * 输出：[1,2,4]
 * 解释：输入数组表示数字 123。
 * 示例 2：
 * <p>
 * 输入：digits = [4,3,2,1]
 * 输出：[4,3,2,2]
 * 解释：输入数组表示数字 4321。
 * 示例 3：
 * <p>
 * 输入：digits = [0]
 * 输出：[1]
 */
public class T_66 {
    public static void main(String[] args) {
        System.out.println(plusOne(new int[]{9, 9}));
    }

    /**
     * 提交成功的方法
     *
     * @param ints 输入数组
     * @return 输出结果
     */
    private static int[] plusOne(int[] ints) {
        // 末位 + 1
        ints[ints.length - 1] += 1;
        // 开始判断是否进位
        for (int i = ints.length - 1; i > 0; i--) {
            if (ints[i] >= 10) {
                ints[i - 1] += 1;
                ints[i] -= 10;
            }
        }
        // 首位>10
        if (ints[0] >= 10) {
            int[] newInts = new int[ints.length + 1];
            for (int i = ints.length - 1; i > 0; i--) {
                newInts[i + 1] = ints[i];
            }
            newInts[1] = ints[0] - 10;
            newInts[0] = 1;
            return newInts;
        }
        return ints;
    }


    /**
     * 此方法效率过低，提交会导致超出内存限制
     *
     * @param arr
     * @return
     */
    public static int[] addOne(int[] arr) {
        int num = 0;
        for (int i = 0; i < arr.length; i++) {
            num += arr[i] * Math.pow(10, arr.length - i - 1);
        }
        num += 1;

//        int[] resultArr = new int[arr.length + 1];
//        for (int i = resultArr.length - 1; i >= 0; i--) {
//            resultArr[i] = num % 10;
//            num = num / 10;
//        }

        List<Integer> list = new ArrayList<>();
        while (num / 10 > 0) {
            list.add(num % 10);
        }
        Integer[] array = list.stream().toArray(Integer[]::new);
        int[] resultArr = Arrays.stream(array).mapToInt(Integer::intValue).toArray();

        return resultArr;
    }
}
